package com.webber.demo.common.utils;

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

import javax.imageio.ImageIO;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;


public class ImageUtil {

	private float QualNum = 0.5f; // 缩略质量,默认0.75高
	String errCode = "";
	private int minthumbwidth = 720;
	private int minthumbheight = 409;

	private String[] imageFormat = { ".jpg", ".jpeg", ".gif", ".bmp", ".png" }; // 进行图片缩略种类

	public int getMinthumbminthumbwidth() {
		return minthumbwidth;
	}

	public void setMinthumbminthumbwidth(int minthumbwidht) {
		this.minthumbwidth = minthumbwidht;
	}

	public int getMinthumbheight() {
		return minthumbheight;
	}

	public void setMinthumbheight(int minthumbheight) {
		this.minthumbheight = minthumbheight;
	}

	public static void main(String[] args) {
		ImageUtil test = new ImageUtil();
		test.Converting("D:/ueupload/image/", 200, 160);
	}

	/**
	 * 是否是可以转换的格式
	 * 
	 * @param src
	 *            String
	 * @return boolean
	 */
	public boolean isAlter(String src) {
		for (int i = 0; i < imageFormat.length; i++) {
			if (src.toUpperCase().endsWith(imageFormat[i].toUpperCase())) {
				return true;
			}
		}
		return false;
	}

	public String getErrCode() {
		return errCode;
	}

	public void setErrCode(String errCode) {
		this.errCode = errCode;
	}

	/**
	 * 调整图片缩放大小
	 * 
	 * @param srcImgFile
	 *            源图片地址
	 * @param toImgFile
	 *            转换后图片地址
	 * @param new_w
	 *            要转换的图片的宽度
	 * @param new_h
	 *            要转换的图片的高度
	 * @return boolean
	 */
	public boolean alterSize(String srcImgFile, String toImgFile, int new_w, int new_h) {
		java.io.File file = new java.io.File(srcImgFile);
		if (!file.exists()) {
			errCode = "文件srcImgFile不存在";
			return false;
		}
		if (!isAlter(srcImgFile)) {
			if (srcImgFile.toLowerCase().endsWith(".bmp")) {
				// 如果为bmp图，则将原图放置到缩略图目录，防止无缩略图产生的
				// 前台组件图片不显示问题
				// webber.core.WebberFileSystem.copyFile(srcImgFile,toImgFile);
				return true;
			} else {
				errCode = "不支持此格式的文件格式";
				// Log.note(errCode);
				return false;
			}
		}

		// 对gif做单独处理
		if (srcImgFile.toLowerCase().endsWith("gif")) {
			// return alterGifSize(srcImgFile, toImgFile, show_w, show_h);
			return false;
		}

		// 源图片对象
		Image src = null;
		try {
			src = ImageIO.read(file);
			int show_w = 0; // 生成图片时的宽度
			int show_h = 0; // 生成图片时的高度
			int iwidth = new_w; // 定义允许图片宽度
			int iheight = new_h; // 定义允许图片高度
			int width = src.getWidth(null); // 传入图片实际的宽度
			int height = src.getHeight(null); // 传入图片实际高度

			if (width < new_w || height < new_h) {
				// return
				// webber.core.WebberFileSystem.copyFile(srcImgFile,toImgFile);
				return false;
			}

			if (width > 0 && height > 0) // 获取源图片大小,处理图片宽度和高度
			{

				if (width / height >= iwidth / iheight) {
					if (width > iwidth) {
						show_w = iwidth;
						show_h = (height * iwidth) / width;
						if (show_h <= 0) {
							show_h = 1;
						}
					} else {
						show_w = width;
						show_h = height;
					}

				} else {
					if (height > iheight) {
						show_h = iheight;
						show_w = (width * iheight) / height;
						if (show_w <= 0) {
							show_w = 1;
						}
					} else {
						show_w = width;
						show_h = height;
					}

				}

			}

			// 缩略
			Image scaleImage = src.getScaledInstance(show_w, show_h, Image.SCALE_SMOOTH);

			// 画缩略
			BufferedImage dsti = new BufferedImage(show_w, show_h, java.awt.image.BufferedImage.TYPE_INT_RGB);
			Graphics2D dstg = dsti.createGraphics();
			dstg.drawImage(scaleImage, 0, 0, show_w, show_h, null);
			dstg.dispose();

			FileOutputStream newimage = new FileOutputStream(toImgFile);
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
			JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(dsti);
			// 文件的清晰度，冲0.1f 到1.0f 清晰度冲低到高
			param.setQuality(QualNum, false);
			encoder.encode(dsti); // JPEG编码
			newimage.close();

		} catch (Exception ex) {
			errCode = "缩略图片错误:";
			// Log.error(ex);
			return false;
		} catch (OutOfMemoryError ex) {
			errCode = "内存溢出错误:";
//			webber.core.WebberFileSystem.copyFile(srcImgFile, toImgFile);
			// Log.error(ex);
			return false;
		}
		return true;
	}

	public boolean Converting(String filepath) {
		if (filepath == null || filepath.equals("")) {
			return false;
		}

		File f = new File(filepath);
		if (!f.exists()) {
			return false;
		}
		File root = new File(filepath);

		if (root.isFile()) {
			alterSize(filepath, filepath, minthumbwidth, minthumbheight);
		} else {
			File[] filesOrDirs = root.listFiles();
			for (int i = 0; i < filesOrDirs.length; i++) {
				if (filesOrDirs[i].isDirectory()) {
					Converting(filesOrDirs[i].getAbsolutePath());
				} else {
					alterSize(filesOrDirs[i].getAbsolutePath(), filesOrDirs[i].getAbsolutePath(), minthumbwidth, minthumbheight);
				}
			}
		}
		return true;
	}

	public boolean Converting(String filepath, int width, int height) {
		if (filepath == null || filepath.equals("")) {
			return false;
		}

		File f = new File(filepath);
		if (!f.exists()) {
			return false;
		}
		File root = new File(filepath);

		if (root.isFile()) {
			alterSize(filepath, filepath, width, height);
		} else {
			File[] filesOrDirs = root.listFiles();
			for (int i = 0; i < filesOrDirs.length; i++) {
				if (filesOrDirs[i].isDirectory()) {
					Converting(filesOrDirs[i].getAbsolutePath(), width, height);
				} else {
					alterSize(filesOrDirs[i].getAbsolutePath(), filesOrDirs[i].getAbsolutePath(), width, height);
				}
			}
		}
		return true;
	}
}
